<?php
/**
 * parsepage()
 * Функция парсит страницу ЦБР на конкретное число и возвращает массив значений
 * 
 * @param Дата в формате timestamp
 * @return Массив значений для конкретной даты
 */
function parsepage($date){
// Загрузим целевую страницу
	$date = date("d.m.Y", $date);
	$targetpage = "http://www.cbr.ru/currency_base/D_print.aspx?date_req=$date";
		$rawHTML = file_get_contents($targetpage);
// ищем нужный кусок /u ищем в кирилице
	$patern = "/<td[\sa-zA-Z=\"]*>[\sa-z&;]*([\s\d,]*[\sA-Z]*[\sа-яА-ЯёЁ()]*)<\/td>/u";
	preg_match_all($patern, $rawHTML, $match);
// подготавливаем данные к вводу в базу
	$minor = 0;
	$major = 0;
	$arr = array();
	foreach($match[1] as $val){
		if ($minor == 5) {$minor = 0; $major++;}
		$arr[$major][] = $val;
		$minor++;
	}
// Теперь у нас есть массив значений разбитый по ячейкам
	//print_r($arr); но я его вам не отдам
	return $arr;
}

/**
 * createDB()
 * Используется единожды для создания базы
 * 
 * @param Указатель на файл SQLite
 */
function createDB($_db){
	$sql = "CREATE DATABASE IF NOT EXISTS ".DBNAME;
    mysql_query($sql, $_db) 
    or die (file_put_contents(ERRLOG, mysql_error(), FILE_APPEND));
}
function createTABLE($_db){
    mysql_select_db(DBNAME, $_db) 
    or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
	
    $sql = "
	CREATE TABLE IF NOT EXISTS currency_rate (
		nid INTEGER(3) NOT NULL,
		cid CHAR(3) NOT NULL,
		units INTEGER NOT NULL DEFAULT 1,
		currname VARCHAR(45) DEFAULT '',
		rate NUMERIC(10,5) DEFAULT 0,
		date INT(10) NOT NULL,
		primary key(cid, date)
		)";
    
    mysql_query($sql, $_db)
    or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
}

/**
 * insert2DB()
 * Вставка в базу используется потоками
 * 
 * @param поток
 * @param дата
 * @param множитель
 * @return
 */
function insert2DB($id, $date, $mult = 1){
	if ($date <= mkTime(0,0,0) ){
		set_time_limit(120);
		$data = parsePage($date);
        
        $_db = mysql_connect(HOST, LOGIN, PASSWORD)
        or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
        mysql_select_db(DBNAME, $_db) or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
        mysql_query('START TRANSACTION', $_db) 
        or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
		foreach($data as $cortege){
			$cortege[4] = str_replace(',','.',$cortege[4]);
			$sql = "INSERT INTO currency_rate
				VALUES (
						$cortege[0],
						'$cortege[1]',
						$cortege[2],
						'$cortege[3]',
						$cortege[4],
						$date)";
		$query = mysql_query($sql, $_db) or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
		}
        mysql_query('COMMIT', $_db)
        or die (file_put_contents(ERRLOG, mysql_error()."\r\n", FILE_APPEND));
		mysql_close($_db);
			$logstr = date("d/m/Y H:i:s", $date)." treadID - $id<br>\r\n";
			file_put_contents(LOGFILE, $logstr, FILE_APPEND);
		
			if ($date < mkTime(0,0,0) ){
				$date = strtotime("+$mult day", $date);
				insert2DB($id, $date, $mult);
			}
			if ($date == mkTime(0,0,0) ){
				file_put_contents(LOGFILE, "FINISH at ". date("d/m/Y H:i:s") ." treadID - $id<br>\r\n", FILE_APPEND);
			}
}	else{
				file_put_contents(LOGFILE, "FINISH at ". date("d/m/Y H:i:s") ." treadID - $id<br>\r\n", FILE_APPEND);
}
}

// Функция вызова потока без рекурсий простой цикл
//приходит начальная дата и количество потоков
//вызывает insert2DB отдельным сокетом с индивидуальным идентификатором и датой начала
//insert2DB в дальнейшем сам просчитывает даты перехода
/**
 * runThread()
 * Входная функция распределения потоков
 * 
 * @param НачальнаяДата
 * @param Множитель
 */
function runThread($date, $mult = 1){
$date = strtotime("+1 day", $date);
$_name = $_SERVER['SERVER_NAME'];
$_port = $_SERVER['SERVER_PORT'];
$_addr = str_replace("RAWhtml-parser-index.php", THREAD, $_SERVER['REQUEST_URI']);
	for($_id=0; $_id<$mult; $_id++){
		$POSTstr = "id=$_id&date=$date&mult=$mult";
		$date = strtotime("+1 day", $date);
		$socket = fsockopen($_name, $_port, $error, $errorMsg, 120);
			$out = "POST ".$_addr." HTTP/1.1\r\n";
			$out .= "Host: $_name\r\n";
			$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
			$out .= "Content-Length: ".strlen($POSTstr)."\r\n\r\n";
			$out .= $POSTstr."\r\n\r\n";
			$out .= "Connection: Close\r\n\r\n";
			fputs($socket, $out);
			fclose($socket);
	}
}

/**
 * cidmenu()
 * 
 * @param mixed $_db
 * @return
 */
function cidmenu($_db){
	$sql = "SELECT DISTINCT cid FROM currency_rate ORDER BY cid";
	$result = mysql_query($sql, $_db);
    while($row = mysql_fetch_array($result, MYSQL_ASSOC) ){
        $query[] = $row;
    }
	
    
    
    if (empty($query[0]) ) exit;
//  Текущее значение
    if (!isset($_GET['curid']) ){
        $curr = "";
    } else{
        $curr = $_GET['curid'];
    }
//	формируем выпадающий список валют
	$_cid = array();
	$option = '<select name="curid">';
	foreach ($query as $var){
		$_cid = $var['cid'];
        if ($_cid == $curr){
            $selected = " selected";
        }else{
            $selected = "";
        }
		$option .= '<option'.$selected.'>';
		$option .= $_cid;
		$option .= '</option>';
	}$option .= '</select>';
	
return $option;
}
?>